home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok12
/
module
/
arraysort.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
2KB
|
77 lines
(*---------------------------------------------------------------------------
:Program. ArraySort.mod
:Author. Bernd Preusing
:Address. Gerhardstr. 16 D-2200 Elmshorn
:Phone. 04121/22486
:Shortcut. [bep]
:Version. 1.0
:Date. 21-Oct-88
:Copyright. PD
:Language. Modula-II
:Translator. M2Amiga
:Imports. ---
:UpDate.
:Contents. universal array sorter
:Remark.
---------------------------------------------------------------------------*)
IMPLEMENTATION MODULE ArraySort;
FROM SYSTEM IMPORT
ADDRESS, ADR;
FROM Arts IMPORT
StkChk, Assert;
(* TYPE
prLess = PROCEDURE(ADDRESS,ADDRESS):BOOLEAN;
*)
(* $R- $V- $S- *) (* kann beides unmöglich auftreten! *)
(* Implementiert als HeapSort, da nur wenig langsamer als Quicksort, aber
im schlechtesten Fall schneller und Code viel kürzer *)
PROCEDURE Sort(VAR arr:ARRAY OF ADDRESS;
count:LONGINT;
less: prLess);
VAR
d,r,i,j: LONGINT;
h: ADDRESS;
ok: BOOLEAN;
BEGIN
StkChk(-50); (* nur einmal prüfen reicht! *)
Assert((count>0) AND (count<=(HIGH(arr)+1)),
ADR('Sort: falscher count-Parameter'));
d:=count DIV 2;
r:=count-1;
WHILE r>0 DO
IF d<=0 THEN
h:=arr[0]; arr[0]:=arr[r]; arr[r]:=h;
i:=0;
DEC(r)
ELSE
DEC(d);
i:=d
END;
h:=arr[i];
ok:=FALSE;
j:=2*i;
WHILE NOT ok AND (r>=j) DO
IF (j<r) AND (less(arr[j],arr[j+1])) THEN
INC(j)
END;
IF less(h,arr[j]) THEN
arr[i]:=arr[j];
i:=j;
j:=2*i (* guter Compiler, macht daraus ASL #1,xx! *)
ELSE
ok:=TRUE
END;
END; (* while not .. *)
arr[i]:=h
END; (* while r>0 *)
END Sort;
END ArraySort.mod